////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifewb12.h
/// @brief camxifewb12 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXIFEWB12_H
#define CAMXIFEWB12_H

// Camx includes
#include "camxformats.h"
#include "camxispiqmodule.h"
#include "titan170_ife.h"

// Common library includes
#include "iqcommondefs.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED

/// @brief WB register Configuration
struct IFEWB12RegCmd
{
    IFE_IFE_0_VFE_DEMO_WB_LEFT_CFG_0           WBLeftConfig0;            ///< WB_LEFT_CFG_0
    IFE_IFE_0_VFE_DEMO_WB_LEFT_CFG_1           WBLeftConfig1;            ///< WB_LEFT_CFG_1
    IFE_IFE_0_VFE_DEMO_WB_LEFT_OFFSET_CFG_0    WBLeftOffsetConfig0;      ///< WB_LEFT_OFFSET_CFG_0
    IFE_IFE_0_VFE_DEMO_WB_LEFT_OFFSET_CFG_1    WBLeftOffsetConfig1;      ///< WB_LEFT_OFFSET_CFG_1
} CAMX_PACKED;

CAMX_END_PACKED

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for IFE WB12 Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class IFEWB12 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create IFEWB12 Object
    ///
    /// @param  pCreateData Pointer to data for Demux Creation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Execute process capture request to configure module
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IFEWB12
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    IFEWB12();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IFEWB12
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IFEWB12();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check if the Dependence Data has changed
    ///
    /// @param  pInputData Point to the Input Data
    ///
    /// @return TRUE if dependencies met
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Perform the Calculation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Generate the Command List
    ///
    /// @param  pInputData Point to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateManualGain
    ///
    /// @brief  Update CC gain from application
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateManualGain();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        const ISPInputData* pInputData
    ) const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpRegConfig
    ///
    /// @brief  Print register configuration of WB module for debug
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DumpRegConfig() const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// InitRegValues
    ///
    /// @brief  Initialize registers with known set of values
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE VOID InitRegValues();

    IFEWB12(const IFEWB12&)            = delete;    ///< Disallow the copy constructor
    IFEWB12& operator=(const IFEWB12&) = delete;    ///< Disallow assignment operator

    WB12InputData   m_dependenceData;               ///< Dependence/Input Data for this Module
    AWBGainParams   m_manualControl;                ///< AWB CC gain from app
    IFEWB12RegCmd   m_regCmd;                       ///< Register List of this module
    BOOL            m_manualGainOverride;           ///< Manual Control override flag
};

CAMX_NAMESPACE_END

#endif // CAMXIFEWB12_H
